
var SWFUpload = function(init_settings) {
  try {
    document.execCommand("BackgroundImageCache", false, true);
  } catch (ex) {
    this.debugMessage(ex);
  }
  try {
    this.settings = {};
    this.movieName = "SWFUpload_" + SWFUpload.movieCount++;
    this.movieElement = null;
    SWFUpload.instances[this.movieName] = this;
    this.initSettings(init_settings);
    this.loadFlash();
    if (this.debug_enabled) {
      this.displayDebugInfo();
    }
  } catch (ex) {
    this.debugMessage(ex);
  }
};
SWFUpload.instances = {};
SWFUpload.movieCount = 0;
SWFUpload.ERROR_CODE_HTTP_ERROR = -10;
SWFUpload.ERROR_CODE_MISSING_UPLOAD_TARGET = -20;
SWFUpload.ERROR_CODE_IO_ERROR = -30;
SWFUpload.ERROR_CODE_SECURITY_ERROR = -40;
SWFUpload.ERROR_CODE_FILE_EXCEEDS_SIZE_LIMIT = -50;
SWFUpload.ERROR_CODE_ZERO_BYTE_FILE = -60;
SWFUpload.ERROR_CODE_UPLOAD_LIMIT_EXCEEDED = -70;
SWFUpload.ERROR_CODE_UPLOAD_FAILED = -80;
SWFUpload.ERROR_CODE_QUEUE_LIMIT_EXCEEDED = -90;
SWFUpload.ERROR_CODE_SPECIFIED_FILE_NOT_FOUND = -100;
SWFUpload.prototype.initSettings = function(init_settings) {
  this.addSetting("control_id", this.movieName, "");
  this.addSetting("ui_function", init_settings.ui_function, null);
  this.addSetting("ui_container_id", init_settings.ui_container_id, "");
  this.addSetting("degraded_container_id", init_settings.degraded_container_id, "");
  this.addSetting("upload_target_url", init_settings.upload_target_url, "");
  this.addSetting("upload_cookies", init_settings.upload_cookies, []);
  this.addSetting("upload_params", init_settings.upload_params, {});
  this.addSetting("begin_upload_on_queue", init_settings.begin_upload_on_queue, true);
  this.addSetting("file_types", init_settings.file_types, "*.gif;*.jpg;*.png");
  this.addSetting("file_types_description", init_settings.file_types_description, "Common Web Image Formats (gif, jpg, png)");
  this.addSetting("file_size_limit", init_settings.file_size_limit, "1024");
  this.addSetting("file_upload_limit", init_settings.file_upload_limit, "0");
  this.addSetting("file_queue_limit", init_settings.file_queue_limit, "0");
  this.addSetting("flash_url", init_settings.flash_url, "swfupload.swf");
  this.addSetting("flash_container_id", init_settings.flash_container_id, "");
  this.addSetting("flash_width", init_settings.flash_width, "1px");
  this.addSetting("flash_height", init_settings.flash_height, "1px");
  this.addSetting("flash_color", init_settings.flash_color, "#FFFFFF");
  this.addSetting("debug_enabled", init_settings.debug, false);
  this.debug_enabled = this.getSetting("debug_enabled");
  this.flashReady = this.retrieveSetting(init_settings.flash_ready_handler, this.flashReady);
  this.dialogCancelled = this.retrieveSetting(init_settings.dialog_cancelled_handler, this.dialogCancelled);
  this.fileQueued = this.retrieveSetting(init_settings.file_queued_handler, this.fileQueued);
  this.fileProgress = this.retrieveSetting(init_settings.file_progress_handler, this.fileProgress);
  this.fileCancelled = this.retrieveSetting(init_settings.file_cancelled_handler, this.fileCancelled);
  this.fileComplete = this.retrieveSetting(init_settings.file_complete_handler, this.fileComplete);
  this.queueStopped = this.retrieveSetting(init_settings.queue_stopped_handler, this.queueStopped);
  this.queueComplete = this.retrieveSetting(init_settings.queue_complete_handler, this.queueComplete);
  this.error = this.retrieveSetting(init_settings.error_handler, this.error);
  this.debug = this.retrieveSetting(init_settings.debug_handler, this.debug);
};
SWFUpload.prototype.loadFlash = function() {
  var html, container, target_element, flash_container_id;
  html = this.getFlashHTML();
  container = document.createElement("div");
  container.style.width = this.getSetting("flash_width");
  container.style.height = this.getSetting("flash_height");
  flash_container_id = this.getSetting("flash_container_id");
  if (flash_container_id !== "") {
    target_element = document.getElementById(flash_container_id);
  }
  if (typeof(target_element) === "undefined" || target_element === null) {
    target_element = document.getElementsByTagName("body")[0];
  }
  if (typeof(target_element) === "undefined" || target_element === null) {
    this.debugMessage("Could not find an element to add the Flash too. Failed to find element for \"flash_container_id\" or the BODY element.");
    return false;
  }
  target_element.appendChild(container);
  container.innerHTML = html;
  this.movieElement = document.getElementById(this.movieName);
  if (typeof(window[this.movieName]) === "undefined" || window[this.movieName] !== this.movieElement) {
    window[this.movieName] = this.movieElement;
  }
};
SWFUpload.prototype.getFlashHTML = function() {
  var html = "";
  if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) {
    html = "<embed type=\"application/x-shockwave-flash\" src=\"" + this.getSetting("flash_url") + "\" width=\"" + this.getSetting("flash_width") + "\" height=\"" + this.getSetting("flash_height") + "\"";
    html += " id=\"" + this.movieName + "\" name=\"" + this.movieName + "\" ";
    html += " allowScriptAccess=\"always\" ";
    html += "bgcolor=\"" + this.getSetting("flash_color") + "\" quality=\"high\" menu=\"false\" flashvars=\"";
    html += this.getFlashVars();
    html += "\" />";
  } else {
    html = "<object id=\"" + this.movieName + "\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\"" + this.getSetting("flash_width") + "\" height=\"" + this.getSetting("flash_height") + "\">";
    html += "<param name=\"movie\" value=\"" + this.getSetting("flash_url") + "\">";
    html += "<param name=\"bgcolor\" value=\"" + this.getSetting("flash_color") + "\" />";
    html += "<param name=\"quality\" value=\"high\" />";
    html += "<param name=\"menu\" value=\"false\" />";
    html += "<param name=\"wmode\" value=\"transparent\" />";
    html += "<param name=\"allowScriptAccess\" value=\"always\" />";
    html += "<param name=\"flashvars\" value=\"";
    html += this.getFlashVars();
    html += "\" /></object>";
  }
  return html;
};
SWFUpload.prototype.getFlashVars = function() {
  var upload_target_url = this.getSetting("upload_target_url");
  var query_string = this.buildQueryString();
  var html = "";
  html += "controlID=" + encodeURIComponent(this.getSetting("control_id"));
  html += "&uploadTargetURL=" + encodeURIComponent(upload_target_url);
  html += "&uploadQueryString=" + encodeURIComponent(query_string);
  html += "&beginUploadOnQueue=" + encodeURIComponent(this.getSetting("begin_upload_on_queue"));
  html += "&fileTypes=" + encodeURIComponent(this.getSetting("file_types"));
  html += "&fileTypesDescription=" + encodeURIComponent(this.getSetting("file_types_description"));
  html += "&fileSizeLimit=" + encodeURIComponent(this.getSetting("file_size_limit"));
  html += "&fileUploadLimit=" + encodeURIComponent(this.getSetting("file_upload_limit"));
  html += "&fileQueueLimit=" + encodeURIComponent(this.getSetting("file_queue_limit"));
  html += "&debugEnabled=" + encodeURIComponent(this.getSetting("debug_enabled"));
  return html;
};
SWFUpload.prototype.buildQueryString = function() {
  var upload_cookies = this.getSetting("upload_cookies");
  var upload_params = this.getSetting("upload_params");
  var query_string_pairs = [];
  var i, value, name;
  if (typeof(upload_cookies) === "object" && typeof(upload_cookies.length) === "number") {
    for (i = 0; i < upload_cookies.length; i++) {
      if (typeof(upload_cookies[i]) === "string" && upload_cookies[i] !== "") {
        value = this.getCookie(upload_cookies[i]);
        if (value !== "") {
          query_string_pairs.push(encodeURIComponent(upload_cookies[i]) + "=" + encodeURIComponent(value));
        }
      }
    }
  }
  if (typeof(upload_params) === "object") {
    for (name in upload_params) {
      if (upload_params.hasOwnProperty(name)) {
        if (typeof(upload_params[name]) === "string") {
          query_string_pairs.push(encodeURIComponent(name) + "=" + encodeURIComponent(upload_params[name]));
        }
      }
    }
  }
  return query_string_pairs.join("&");
};
SWFUpload.prototype.showUI = function() {
  var ui_container_id, ui_target, degraded_container_id, degraded_target;
  try {
    ui_container_id = this.getSetting("ui_container_id");
    if (ui_container_id !== "") {
      ui_target = document.getElementById(ui_container_id);
      if (ui_target !== null) {
        ui_target.style.display = "block";
        degraded_container_id = this.getSetting("degraded_container_id");
        if (degraded_container_id !== "") {
          degraded_target = document.getElementById(degraded_container_id);
          if (degraded_target !== null) {
            degraded_target.style.display = "none";
          }
        }
      }
    }
  } catch (ex) {
    this.debugMessage(ex);
  }
};
SWFUpload.prototype.addSetting = function(name, value, default_value) {
  if (typeof(value) === "undefined" || value === null) {
    this.settings[name] = default_value;
  } else {
    this.settings[name] = value;
  }
  return this.settings[name];
};
SWFUpload.prototype.getSetting = function(name) {
  if (typeof(this.settings[name]) === "undefined") {
    return"";
  } else {
    return this.settings[name];
  }
};
SWFUpload.prototype.retrieveSetting = function(value, default_value) {
  if (typeof(value) === "undefined" || value === null) {
    return default_value;
  } else {
    return value;
  }
};
SWFUpload.prototype.displayDebugInfo = function() {
  var key, debug_message = "";
  debug_message += "----- DEBUG OUTPUT ----\nID: " + this.movieElement.id + "\n";
  for (key in this.settings) {
    if (this.settings.hasOwnProperty(key)) {
      debug_message += key + ": " + this.settings[key] + "\n";
    }
  }
  debug_message += "----- DEBUG OUTPUT END ----\n";
  debug_message += "\n";
  this.debugMessage(debug_message);
};
SWFUpload.prototype.setUploadTargetURL = function(url) {
  if (typeof(url) === "string") {
    return this.addSetting("upload_target_url", url, "");
  } else {
    return false;
  }
};
SWFUpload.prototype.setUploadCookies = function(cookie_name_array) {
  if (typeof(cookie_name_array) === "object" && typeof(cookie_name_array.length) === "number") {
    return this.addSetting("upload_cookies", cookie_name_array, []);
  } else {
    return false;
  }
};
SWFUpload.prototype.setUploadParams = function(param_object) {
  if (typeof(param_object) === "object") {
    return this.addSetting("upload_params", param_object, []);
  } else {
    return false;
  }
};
SWFUpload.prototype.browse = function() {
  if (typeof(this.movieElement) !== "undefined" && typeof(this.movieElement.Browse) === "function") {
    try {
      this.movieElement.Browse();
    } catch (ex) {
      this.debugMessage("Could not call browse: " + ex);
    }
  } else {
    this.debugMessage("Could not find Flash element");
  }
};
SWFUpload.prototype.startUpload = function(file_id) {
  if (typeof(this.movieElement) !== "undefined" && typeof(this.movieElement.StartUpload) === "function") {
    try {
      this.movieElement.StartUpload(file_id);
    } catch (ex) {
      this.debugMessage("Could not call StartUpload: " + ex);
    }
  } else {
    this.debugMessage("Could not find Flash element");
  }
};
SWFUpload.prototype.cancelUpload = function(file_id) {
  if (typeof(this.movieElement) !== "undefined" && typeof(this.movieElement.CancelUpload) === "function") {
    try {
      this.movieElement.CancelUpload(file_id);
    } catch (ex) {
      this.debugMessage("Could not call CancelUpload");
    }
  } else {
    this.debugMessage("Could not find Flash element");
  }
};
SWFUpload.prototype.cancelQueue = function() {
  if (typeof(this.movieElement) !== "undefined" && typeof(this.movieElement.CancelQueue) === "function") {
    try {
      this.movieElement.CancelQueue();
    } catch (ex) {
      this.debugMessage("Could not call CancelQueue");
    }
  } else {
    this.debugMessage("Could not find Flash element");
  }
};
SWFUpload.prototype.stopUpload = function() {
  if (typeof(this.movieElement) !== "undefined" && typeof(this.movieElement.StopUpload) === "function") {
    try {
      this.movieElement.StopUpload();
    } catch (ex) {
      this.debugMessage("Could not call StopUpload");
    }
  } else {
    this.debugMessage("Could not find Flash element");
  }
};
SWFUpload.prototype.updateUploadStrings = function() {
  if (typeof(this.movieElement) !== "undefined" && typeof(this.movieElement.SetUploadStrings) === "function") {
    try {
      this.movieElement.SetUploadStrings(this.getSetting("upload_target_url"), this.buildQueryString());
    } catch (ex) {
      this.debugMessage("Could not call SetUploadStrings");
    }
  } else {
    this.debugMessage("Could not find Flash element");
  }
};
SWFUpload.prototype.addFileParam = function(file_id, name, value) {
  if (typeof(this.movieElement) !== "undefined" && typeof(this.movieElement.AddFileParam) === "function") {
    try {
      return this.movieElement.AddFileParam(file_id, encodeURIComponent(name), encodeURIComponent(value));
    } catch (ex) {
      this.debugMessage("Could not call addFileParam");
    }
  } else {
    this.debugMessage("Could not find Flash element");
  }
};
SWFUpload.prototype.removeFileParam = function(file_id, name) {
  if (typeof(this.movieElement) !== "undefined" && typeof(this.movieElement.RemoveFileParam) === "function") {
    try {
      return this.movieElement.RemoveFileParam(file_id, encodeURIComponent(name));
    } catch (ex) {
      this.debugMessage("Could not call addFileParam");
    }
  } else {
    this.debugMessage("Could not find Flash element");
  }
};
SWFUpload.prototype.flashReady = function() {
  var ui_function;
  try {
    this.debugMessage("Flash called back and is ready.");
    ui_function = this.getSetting("ui_function");
    if (typeof(ui_function) === "function") {
      ui_function.apply(this);
    } else {
      this.showUI();
    }
  } catch (ex) {
    this.debugMessage(ex);
  }
};
SWFUpload.prototype.dialogCancelled = function() { this.debugMessage("browse Dialog Cancelled."); };
SWFUpload.prototype.fileQueued = function(file) { this.debugMessage("File Queued: " + file.id); };
SWFUpload.prototype.fileProgress = function(file, bytes_complete) { this.debugMessage("File Progress: " + file.id + ", Bytes: " + bytes_complete); };
SWFUpload.prototype.fileCancelled = function(file) { this.debugMessage("File Cancelled: " + file.id); };
SWFUpload.prototype.fileComplete = function(file) { this.debugMessage("File Complete: " + file.id); };
SWFUpload.prototype.queueComplete = function(file_upload_count) { this.debugMessage("Queue Complete. Files Uploaded:" + file_upload_count); };
SWFUpload.prototype.queueStopped = function(file) { this.debugMessage("Queue Stopped. File Stopped:" + file.id); };
SWFUpload.prototype.debug = function(message) { this.debugMessage(message); };
SWFUpload.prototype.error = function(errcode, file, msg) {
  try {
    switch (errcode) {
    case SWFUpload.ERROR_CODE_HTTP_ERROR:
      this.debugMessage("Error Code: HTTP Error, File name: " + file.name + ", Message: " + msg);
      break;
    case SWFUpload.ERROR_CODE_MISSING_UPLOAD_TARGET:
      this.debugMessage("Error Code: No backend file, File name: " + file.name + ", Message: " + msg);
      break;
    case SWFUpload.ERROR_CODE_IO_ERROR:
      this.debugMessage("Error Code: IO Error, File name: " + file.name + ", Message: " + msg);
      break;
    case SWFUpload.ERROR_CODE_SECURITY_ERROR:
      this.debugMessage("Error Code: Security Error, File name: " + file.name + ", Message: " + msg);
      break;
    case SWFUpload.ERROR_CODE_FILE_EXCEEDS_SIZE_LIMIT:
      this.debugMessage("Error Code: File too big, File name: " + file.name + ", File size: " + file.size + ", Message: " + msg);
      break;
    case SWFUpload.ERROR_CODE_ZERO_BYTE_FILE:
      this.debugMessage("Error Code: Zero Byte File, File name: " + file.name + ", File size: " + file.size + ", Message: " + msg);
      break;
    case SWFUpload.ERROR_CODE_UPLOAD_LIMIT_EXCEEDED:
      this.debugMessage("Error Code: Upload limit reached, File name: " + file.name + ", File size: " + file.size + ", Message: " + msg);
      break;
    case SWFUpload.ERROR_CODE_QUEUE_LIMIT_EXCEEDED:
      this.debugMessage("Error Code: Upload limit reached, File name: " + file.name + ", File size: " + file.size + ", Message: " + msg);
      break;
    case SWFUpload.ERROR_CODE_UPLOAD_FAILED:
      this.debugMessage("Error Code: Upload Initialization exception, File name: " + file.name + ", File size: " + file.size + ", Message: " + msg);
      break;
    case SWFUpload.ERROR_CODE_SPECIFIED_FILE_NOT_FOUND:
      this.debugMessage("Error Code: File ID specified for upload was not found, Message: " + msg);
      break;
    default:
      this.debugMessage("Error Code: Unhandled error occured. Errorcode: " + errcode);
    }
  } catch (ex) {
    this.debugMessage(ex);
  }
};
SWFUpload.prototype.getCookie = function(cookie_name) {
  var cookie_start, cookie_end;
  try {
    if (document.cookie.length > 0 && cookie_name !== "") {
      cookie_start = document.cookie.indexOf(cookie_name + "=");
      if (cookie_start !== -1) {
        cookie_start = cookie_start + cookie_name.length + 1;
        cookie_end = document.cookie.indexOf(";", cookie_start);
        if (cookie_end === -1) {
          cookie_end = document.cookie.length;
        }
        return unescape(document.cookie.substring(cookie_start, cookie_end));
      }
    }
  } catch (ex) {
    this.debugMessage(ex);
  }
  return"";
};
SWFUpload.prototype.debugMessage = function(message) {
  var exception_message, exception_values;
  if (this.debug_enabled) {
    if (typeof(message) === "object" && typeof(message.name) === "string" && typeof(message.message) === "string") {
      exception_message = "";
      exception_values = [];
      for (var key in message) {
        exception_values.push(key + ": " + message[key]);
      }
      exception_message = exception_values.join("\n");
      exception_values = exception_message.split("\n");
      exception_message = "EXCEPTION: " + exception_values.join("\nEXCEPTION: ");
      SWFUpload.Console.writeLine(exception_message);
    } else {
      SWFUpload.Console.writeLine(message);
    }
  }
};
SWFUpload.Console = {};
SWFUpload.Console.writeLine = function(message) {
  var console, documentForm;
  try {
    console = document.getElementById("SWFUpload_Console");
    if (!console) {
      documentForm = document.createElement("form");
      document.getElementsByTagName("body")[0].appendChild(documentForm);
      console = document.createElement("textarea");
      console.id = "SWFUpload_Console";
      console.style.fontFamily = "monospace";
      console.setAttribute("wrap", "off");
      console.wrap = "off";
      console.style.overflow = "auto";
      console.style.width = "700px";
      console.style.height = "350px";
      console.style.margin = "5px";
      documentForm.appendChild(console);
    }
    console.value += message + "\n";
    console.scrollTop = console.scrollHeight - console.clientHeight;
  } catch (ex) {
    alert("Exception: " + ex.name + " Message: " + ex.message);
  }
};